# 原文链接  http://www.hqqt.com/webnews/16012045284412.html
# == 是比较两个对象的内容是否相等，即两个对象的“值”是否相等，不管两者在内存中的引用地址是否一样。
#
# is 比较的是两个实例对象是不是完全相同，它们是不是同一个对象，占用的内存地址是否相同。即is比较两个条件：1.内容相同。2.内存中地址相同。

#
# a = 10000
# b = 10000
# print(a == b)  # True
# print(a is b)  # True
# print(id(a))  # 4461408208
# print(id(b))  # 4461408208
#
# a = "hello world"
# b = "hello world"
# print(a == b)  # True
# print(a is b)  # True
# print(id(a))  # 4461408208
# print(id(b))  # 4461408208
#
# a = [11, 22, 33]
# b = [11, 22, 33]
# print(a == b)  # True
# print(a is b)  # False
# print(id(a))  # 4409720712
# print(id(b))  # 4409720776
#


# 在上面的代码中，我们分别定义了 a 和 b 两个变量，通过输出结果可以发现当变量为字符串或数字时， is 和 == 的输出结果是一样的，
# 当为列表时 is 和 == 结果不一样，通过打印两个变量的 id 值可以看出两个 id 值不一样，
# 这是由于当我们创建列表 a 和 b 时，是分别开辟了两块内存来分别存储这两个变量，
# 从表象上来看结果是一样的，但两个变量所指向的内存地址不一样，我们将上面的代码改为如下：


a = [11, 22, 33]
b = a
print(a == b)  # True
print(a is b)  # True
print(id(a))  # 4535062408
print(id(b))  # 4535062408

# 在上面的代码中，我们并没有直接给变量 b 赋值，而是让 b=a，这样的话 b 和 a 就指向了同一块内存，所以 a is b 就为 True 了。
#
# 上面的代码我是在 PyCharm 编辑器中实现的，但是在终端命令行实现的话结果却是不一样的，如下：


#  1 >>> a = 10000
#  2 >>> b = 10000
#  3 >>> a == b
#  4 True
#  5 >>> a is b
#  6 False
#  7 >>> id(a)
#  8 4360555120
#  9 >>> id(b)
# 10 4360555216


# 当我们将 a 和 b 的值变小时，如下：
#
# >>> a = 100
# >>> b = 100
# >>> a == b
# True
# >>> a is b
# True
# >>> id(a)
# 4357367984
# >>> id(b)
# 4357367984


# 造成上面的原因是因为python对小整数在内存中直接创建了一份，不会回收，所有创建的小整数变量直接从对象池中引用他即可。
# 但是注意Python仅仅对比较小的整数对象进行缓存（范围为范围[-5, 256]）缓存起来，而并非是所有整数对象。也就说只有在这个[-5,256]范围内创建的变量值使用is比较时候才会成立。
#
# 在 PyCharm 中，当值超过 256 时 is 和 == 的输出结果仍是一样，这是因为解释器也做了一部分优化，对于数字和字符串这类变量都进行了缓存。
#
# 我们再来看一下在终端命令行中当变量为字符串时：

#
# 1 >>> a = "hello world"
#  2 >>> b = "hello world"
#  3 >>> a == b
#  4 True
#  5 >>> a is b
#  6 False
#  7 >>> id(a)
#  8 4359747248
#  9 >>> id(b)
# 10 4361247408
#
#  1 >>> a = "hello"
#  2 >>> b = "hello"
#  3 >>> a == b
#  4 True
#  5 >>> a is b
#  6 True
#  7 >>> id(a)
#  8 4361199040
#  9 >>> id(b)
# 10 4361199040


# 通过输出结果可以看出，在命令行中当变量为简单字符串时输出结果一致，否则输出结果不一致，这是由于
# Python
# 对简单字符串对象也进行了缓存，这样做的意义是可以优化代码的运行速度，减少内存消耗。
